package com.sunxueqi.framework.web.controller;

import java.beans.PropertyEditorSupport;
import java.util.Date;

import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

import com.github.pagehelper.page.PageMethod;
import com.sunxueqi.common.utils.ServletUtils;
import com.sunxueqi.framework.web.vo.ResponseData;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

public class BaseController {

	/**
	 * 分页开始的索引
	 */
	public static final String PAGE_NUM = "pageNum";
	/**
	 * 每页显示的数量
	 */
	public static final String PAGE_SIZE = "pageSize";
	/**
	 * 排序列
	 */
	public static final String ORDER_BY_COLUMN = "orderByColumn";
	/**
	 * 排序方向 "desc" 或者 "asc"
	 */
	public static final String IS_ASC = "isAsc";
	
	/**
	 * 封装的分页查询方法
	 */
	protected void startPage() {
		Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM);
		Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE);
		
		if(ObjectUtil.isNotEmpty(pageNum) && ObjectUtil.isNotEmpty(pageSize)) {
			PageMethod.startPage(pageNum, pageSize, getOrderBy());
		}
	}
	
	/**
	 * 获取排序方式
	 * @return
	 */
	public String getOrderBy() {
		String orderByColumn = escapeOrderBySql(ServletUtils.getParameter(ORDER_BY_COLUMN));
		orderByColumn = StrUtil.isEmpty(orderByColumn) ? "create_time" : orderByColumn;
		String isAsc = ServletUtils.getParameter(IS_ASC);
		
		String result = orderByColumn + " "+ isAsc;
		return result;
	}
	
	/**
	 * 校验order by语句是否符合规范
	 * @param str
	 * @return 如果符合规范，则返回原值，否则返回""
	 */
	public static String escapeOrderBySql(String str) {
	    /**
	     * 仅支持字母、数字、下划线、空格、逗号（支持多个字段排序）
	     */
	    String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,]+";
	    
	    if(StrUtil.isNotBlank(str) && !str.matches(SQL_PATTERN)) {
	    	return "";
	    }
	    return str;
	}
	
	/**
	 * 将前台日期格式的字符串，自动转换为Date类型
	 * @param binder
	 */
	@InitBinder
	public void initBinder(WebDataBinder binder) {
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
			public void setAsTest(String dateStr) {
				System.out.println("okkk");
				setValue(DateUtil.parse(dateStr));
			}
		});
	}
	
	
	/**
	 * 返回响应结果
	 * @param rows 影响的行数
	 * @return 响应结果
	 */
	protected ResponseData getResponseDataRow(int rows) {
		return rows > 0 ? ResponseData.success(): ResponseData.error();
	}
	
}
